home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
001
/
pibt3sp2.arc
/
PIBHOSTB.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-08-30
|
33KB
|
856 lines
(*----------------------------------------------------------------------*)
(* Process_Host_Commands --- Process main menu commands *)
(*----------------------------------------------------------------------*)
OVERLAY PROCEDURE Process_Host_Commands( VAR Done: BOOLEAN );
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Process_Host_Commands *)
(* *)
(* Purpose: Controls processing of main menu commands. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Process_Host_Commands( VAR Done: BOOLEAN ); *)
(* *)
(* Done --- set TRUE if quit command entered or carrier *)
(* dropped. *)
(* *)
(*----------------------------------------------------------------------*)
VAR
Back : BOOLEAN;
Ch : CHAR;
Sysop_Found : BOOLEAN;
(*----------------------------------------------------------------------*)
(* Display_Host_Commands --- Display command list for remote user *)
(*----------------------------------------------------------------------*)
PROCEDURE Display_Host_Commands;
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Display_Host_Commands *)
(* *)
(* Purpose: Displays menu of PibTerm host commands and prompts *)
(* for command entry. *)
(* *)
(* Calling sequence: *)
(* *)
(* Display_Host_Commands; *)
(* *)
(*----------------------------------------------------------------------*)
BEGIN (* Display_Host_Commands *)
IF ( NOT Expert_On ) THEN
BEGIN
Host_Send_String_With_CR('======================================================');
Host_Send_String_With_CR('= PibTerm Host Mode Main Menu =');
Host_Send_String_With_CR('======================================================');
Host_Send_String_With_CR(' ');
Host_Send_String_With_CR(' E=Enter message');
Host_Send_String_With_CR(' R=Read message');
Host_Send_String_With_CR(' S=Scan messages');
Host_Send_String_With_CR(' P=Personal message scan');
Host_Send_String_With_CR(' Q=Quit and logoff');
Host_Send_String_With_CR(' F=File transfers');
Host_Send_String_With_CR(' G=Gossip mode');
Host_Send_String_With_CR(' X=Expert mode');
Host_Send_String_With_CR(' C=Send comments');
Host_Send_String_With_CR(' ');
Host_Send_String_With_CR('======================================================');
Host_Send_String_And_Echo('Enter command ? ');
END
ELSE
BEGIN
Host_Send_String_With_CR(' ');
Host_Send_String_And_Echo('Main (E,R,S,P,Q,F,G,X,C) ? ');
END;
END (* Display_Host_Commands *);
(*----------------------------------------------------------------------*)
(* Get_A_Message --- Get text of message from user *)
(*----------------------------------------------------------------------*)
PROCEDURE Get_A_Message( VAR F: Text_File );
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Get_A_Message *)
(* *)
(* Purpose: Prompts for line by line message entry. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Get_A_Message( VAR F: Text_File ); *)
(* *)
(* F --- file to write message to. *)
(* *)
(* Remarks: *)
(* *)
(* This routine handles text entry for both regular messages and *)
(* comments. *)
(* *)
(*----------------------------------------------------------------------*)
BEGIN (* Get_A_Message *)
WITH User_List[Cur_User] DO
WRITELN( F, '== From: ', Fname, ' ', Lname );
WRITELN( F, '== To: ',Recipient_Name );
WRITELN( F, '== Date: ',DateString );
WRITELN( F, '== Time: ',TimeString( TimeOfDay ) );
WRITELN( F, '== Subject: ',Message_Subject );
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('Enter message. Empty line terminates.');
REPEAT
Host_Send_String( CR_LF_Host );
Host_Prompt_And_Read_String('> ', Message_Line, TRUE );
IF LENGTH( Message_Line ) > 0 THEN
WRITELN( F, Message_Line );
UNTIL ( LENGTH( Message_Line ) = 0 );
WRITELN( F, '== End');
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('Message entered.');
END (* Get_A_Message *);
(*----------------------------------------------------------------------*)
(* Enter_Message --- Enter a message into message base *)
(*----------------------------------------------------------------------*)
PROCEDURE Enter_Message;
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Enter_Message *)
(* *)
(* Purpose: Enters message into message base. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Enter_Message; *)
(* *)
(*----------------------------------------------------------------------*)
VAR
Quit: BOOLEAN;
BEGIN (* Enter_Message *)
Quit := FALSE;
(* Open message file *)
ASSIGN( Message_File, Home_Dir + 'PIBTERM.MSG' );
(*$I-*)
RESET ( Message_File );
(*$I+*)
(* If it exists, open for append. *)
(* If it doesn't exist, open for write. *)
IF Int24Result <> 0 THEN
BEGIN
WRITELN('Creating message file PIBTERM.MSG');
(*$I-*)
REWRITE( Message_File );
(*$I+*)
IF Int24Result <> 0 THEN
BEGIN
Host_Send_String_With_CR('Sorry, no more room for messages');
Quit := TRUE;
END;
END
ELSE
BEGIN
(*$I-*)
CLOSE( Message_File );
APPEND( Message_File );
(*$I+*)
IF Int24Result <> 0 THEN
BEGIN
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('Sorry, no more room for messages');
Quit := TRUE;
END;
END;
Host_Send_String( CR_LF_Host );
Host_Prompt_And_Read_String('Enter recipient''s name or ALL: ',
Recipient_Name, TRUE );
Recipient_Name := UpperCase( TRIM( Recipient_Name ) );
IF Recipient_Name = '' THEN
Recipient_Name := 'ALL';
Host_Send_String( CR_LF_Host );
Host_Prompt_And_Read_String('Enter title for message: ',
Message_Subject, TRUE );
IF ( NOT Quit ) THEN
Get_A_Message( Message_File );
(*$I-*)
CLOSE ( Message_File );
(*$I+*)
(* Increment message count *)
NMessages := NMessages + 1;
END (* Enter_Message *);
(*----------------------------------------------------------------------*)
(* Skip_To_Message --- Skip to specified message in message base *)
(*----------------------------------------------------------------------*)
PROCEDURE Skip_To_Message( Msg_No : INTEGER );
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Skip_To_Message *)
(* *)
(* Purpose: Skip to specified message in message base. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Skip_To_Message( Msg_No : INTEGER ); *)
(* *)
(* Msg_No --- Message to skip to. *)
(* *)
(* Remarks: *)
(* *)
(* The message file must be opened before this routine is *)
(* called. *)
(* *)
(*----------------------------------------------------------------------*)
VAR
Msg_Count : INTEGER;
BEGIN (* Skip_To_Message *)
Msg_Count := 0;
REPEAT
READLN( Message_File , Message_Line );
IF COPY( Message_Line, 1, 6 ) = '== End' THEN
Msg_Count := Msg_Count + 1;
UNTIL ( Msg_Count = ( Msg_No - 1 ) );
END (* Skip_To_Message *);
(*----------------------------------------------------------------------*)
(* Read_Messages --- Read messages from message base *)
(*----------------------------------------------------------------------*)
PROCEDURE Read_Messages;
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Read_Messages *)
(* *)
(* Purpose: Reads messages currently in message base. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Read_Messages; *)
(* *)
(*----------------------------------------------------------------------*)
VAR
Message_No : INTEGER;
CMessage_No : STRING[5];
I : INTEGER;
Line_Count : INTEGER;
Read_Done : BOOLEAN;
Start_Msg : INTEGER;
Start_M_Str : AnyStr;
OK_Number : BOOLEAN;
LABEL
Reading_Done;
BEGIN (* Read_Messages *)
(* Open message file *)
ASSIGN( Message_File , Home_Dir + 'PIBTERM.MSG' );
(*$I-*)
RESET( Message_File );
(*$I+*)
(* Not there -- no messages *)
IF Int24Result <> 0 THEN
BEGIN
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('No messages in message file.');
EXIT;
END;
(* Find where to start *)
OK_Number := TRUE;
REPEAT
Host_Send_String_With_CR(' ');
Host_Prompt_And_Read_String('Enter message to start at or <CR> for all: ',
Start_M_Str, TRUE );
Start_Msg := 0;
FOR I := 1 TO LENGTH( Start_M_Str ) DO
IF ( Start_M_Str[I] IN ['0'..'9'] ) THEN
Start_Msg := Start_Msg * 10 + ORD( Start_M_Str[I] ) - ORD('0')
ELSE
OK_Number := FALSE;
IF Start_Msg = 0 THEN Start_Msg := 1;
IF Start_Msg > NMessages THEN Start_Msg := NMessages;
UNTIL ( NOT Host_Carrier_Detect ) OR ( OK_Number );
IF ( NOT Host_Carrier_Detect ) THEN GOTO Reading_Done;
(* Skip to desired message *)
Skip_To_Message( Start_Msg );
(* Messages always start at one *)
Message_No := Start_Msg - 1;
Read_Done := FALSE;
Line_Count := 0;
(* Loop over messages *)
REPEAT
(* Increment message number *)
Message_No := Message_No + 1;
STR( Message_No : 5 , CMessage_No );
Host_Send_String( CR_LF_Host );
List_Prompt( Line_Count , Read_Done );
IF Read_Done THEN GOTO Reading_Done;
Host_Send_String_With_CR('Message #' + CMessage_No);
List_Prompt( Line_Count , Read_Done );
IF Read_Done THEN GOTO Reading_Done;
(* Display message # and header info *)
FOR I := 1 TO 5 DO
BEGIN
READLN( Message_File , Message_Line );
Message_Line := COPY( Message_Line, 4,
LENGTH( Message_Line ) - 3 );
Host_Send_String_With_CR( Message_Line );
List_Prompt( Line_Count , Read_Done );
IF Read_Done THEN GOTO Reading_Done;
END;
Host_Send_String_With_CR(' ');
List_Prompt( Line_Count , Read_Done );
IF Read_Done THEN GOTO Reading_Done;
(* Display body of message *)
REPEAT
READLN( Message_File , Message_Line );
IF ( COPY( Message_Line, 1, 6 ) <> '== End' ) THEN
BEGIN
Host_Send_String_With_CR( COPY( Message_Line, 2,
LENGTH( Message_Line ) - 1 ) );
List_Prompt( Line_Count , Read_Done );
END;
UNTIL ( COPY( Message_Line, 1, 6 ) = '== End' ) OR ( Read_Done );
UNTIL ( Message_No >= NMessages ) OR Read_Done;
Reading_Done:
(*$I-*)
CLOSE( Message_File );
(*$I+*)
END (* Read_Messages *);
(*----------------------------------------------------------------------*)
(* Scan_Messages --- Scan messages from message base *)
(*----------------------------------------------------------------------*)
PROCEDURE Scan_Messages( Personal_Only : BOOLEAN );
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Scan_Messages *)
(* *)
(* Purpose: Scans message headers currently in message base. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Scan_Messages( Personal_Only : BOOLEAN ); *)
(* *)
(* Personal_Only --- Return messages addressed to current *)
(* user only. *)
(* *)
(*----------------------------------------------------------------------*)
VAR
Message_Title: AnyStr;
Message_No : INTEGER;
CMessage_No : STRING[5];
I : INTEGER;
Line_Count : INTEGER;
Scan_Done : BOOLEAN;
OK_Number : BOOLEAN;
Start_Msg : INTEGER;
Start_M_Str : AnyStr;
Message_L1 : AnyStr;
Message_L2 : AnyStr;
Msg_Count : INTEGER;
LABEL
Scanning_Done;
BEGIN (* Scan_Messages *)
(* Open message file *)
ASSIGN( Message_File , Home_Dir + 'PIBTERM.MSG' );
(*$I-*)
RESET( Message_File );
(*$I+*)
(* Not there -- no messages *)
IF Int24Result <> 0 THEN
BEGIN
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('No messages in message file.');
GOTO Scanning_Done;
END;
(* Find where to start -- if only *)
(* personal messages, always scan *)
(* entire message base. *)
OK_Number := TRUE;
Start_Msg := 1;
IF ( NOT Personal_Only ) THEN
REPEAT
(* Request starting message number *)
Host_Send_String_With_CR(' ');
Host_Prompt_And_Read_String('Enter message to start at or <CR> for all: ',
Start_M_Str, TRUE );
(* Convert response to message number *)
Start_Msg := 0;
FOR I := 1 TO LENGTH( Start_M_Str ) DO
IF ( Start_M_Str[I] IN ['0'..'9'] ) THEN
Start_Msg := Start_Msg * 10 + ORD( Start_M_Str[I] ) - ORD('0')
ELSE
OK_Number := FALSE;
(* Ensure message is in range *)
IF Start_Msg = 0 THEN Start_Msg := 1;
IF Start_Msg > NMessages THEN Start_Msg := NMessages;
UNTIL ( NOT Host_Carrier_Detect ) OR ( OK_Number );
IF ( NOT Host_Carrier_Detect ) THEN GOTO Scanning_Done;
(* Skip to desired message *)
Skip_To_Message( Start_Msg );
(* Messages always start at one *)
Message_No := Start_Msg - 1;
Line_Count := 0;
Scan_Done := FALSE;
Msg_Count := 0;
(* Loop over messages *)
REPEAT
(* Increment message number *)
Message_No := Message_No + 1;
(* Read 1st two lines of message *)
READLN( Message_File , Message_L1 );
READLN( Message_File , Message_L2 );
(* Check if recipient is current user *)
IF ( COPY( Message_L2, 13, LENGTH( Message_L2 ) - 12 ) =
Cur_User_Name ) OR ( NOT Personal_Only ) THEN
BEGIN (* Display this message *)
(* Increment personal messages count *)
Msg_Count := Msg_Count + 1;
STR( Message_No : 5 , CMessage_No );
Host_Send_String( CR_LF_Host );
List_Prompt( Line_Count , Scan_Done );
IF Scan_Done THEN GOTO Scanning_Done;
(* Display message number *)
Host_Send_String_With_CR('Message #' + CMessage_No );
List_Prompt( Line_Count , Scan_Done );
IF Scan_Done THEN GOTO Scanning_Done;
(* Display 1st 2 header lines *)
Host_Send_String_With_CR( COPY( Message_L1, 4,
LENGTH( Message_L1 ) - 3 ) );
List_Prompt( Line_Count , Scan_Done );
IF Scan_Done THEN GOTO Scanning_Done;
Host_Send_String_With_CR( COPY( Message_L2, 4,
LENGTH( Message_L2 ) - 3 ) );
List_Prompt( Line_Count , Scan_Done );
IF Scan_Done THEN GOTO Scanning_Done;
(* Display remaining header info *)
FOR I := 3 TO 5 DO
BEGIN
READLN( Message_File , Message_Line );
Message_Line := COPY( Message_Line, 4,
LENGTH( Message_Line ) - 3 );
Host_Send_String_With_CR( Message_Line );
List_Prompt( Line_Count , Scan_Done );
IF Scan_Done THEN GOTO Scanning_Done;
END;
Host_Send_String_With_CR(' ');
List_Prompt( Line_Count , Scan_Done );
END (* Display this message *);
(* Scan for end of message *)
IF ( NOT Scan_Done ) THEN
REPEAT
READLN( Message_File , Message_Line );
UNTIL ( COPY( Message_Line, 1, 6 ) = '== End' );
UNTIL ( Message_No >= NMessages ) OR ( Scan_Done );
Scanning_Done:
(*$I-*)
CLOSE( Message_File );
(*$I+*)
(* Notify user if no personal messages *)
IF Personal_Only THEN
IF Msg_Count = 0 THEN
BEGIN
Host_Send_String_With_CR(' ');
Host_Send_String_With_CR('You have no personal messages waiting.');
END;
END (* Scan_Messages *);
(*----------------------------------------------------------------------*)
(* Enter_Comment --- Enter a comment *)
(*----------------------------------------------------------------------*)
PROCEDURE Enter_Comment;
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Enter_Comment *)
(* *)
(* Purpose: Enters comment into comment file. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Enter_Comment; *)
(* *)
(* Remarks: *)
(* *)
(* The comments file is PIBTERM.CMT. *)
(* *)
(*----------------------------------------------------------------------*)
VAR
Quit: BOOLEAN;
BEGIN (* Enter_Comment *)
Quit := FALSE;
(* Open comments file *)
ASSIGN( Comments_File, Home_Dir + 'PIBTERM.CMT' );
(*$I-*)
RESET ( Comments_File );
(*$I+*)
(* If it exists, open for append. *)
(* If it doesn't exist, open for write. *)
IF Int24Result <> 0 THEN
BEGIN
WRITELN('Creating comments file PIBTERM.CMT');
(*$I-*)
REWRITE( Comments_File );
(*$I+*)
IF Int24Result <> 0 THEN
BEGIN
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('Sorry, can''t accept comments now.');
Quit := TRUE;
END;
END
ELSE
BEGIN
(*$I-*)
CLOSE( Comments_File );
APPEND( Comments_File );
(*$I+*)
IF Int24Result <> 0 THEN
BEGIN
Host_Send_String( CR_LF_Host );
Host_Send_String_With_CR('Sorry, can''t accept comments now.');
Quit := TRUE;
END;
END;
Recipient_Name := 'SYSOP';
Message_Subject := ' ';
IF ( NOT Quit ) THEN
Get_A_Message( Comments_File );
(*$I-*)
CLOSE ( Comments_File );
(*$I+*)
END (* Enter_Comment *);
(*----------------------------------------------------------------------*)
BEGIN (* Process_Host_Commands *)
(* Scan for personal mail on *)
(* first entry here. *)
IF Host_Section = 'I' THEN
BEGIN
Host_Send_String_With_CR(' ');
Host_Send_String_With_CR('Scanning for personal messages ... ');
Scan_Messages( TRUE );
Host_Section := 'M';
END;
(* Prompt for commands *)
Display_Host_Commands;
(* Assume input from remote *)
Kbd_Input := FALSE;
(* Wait for command to be entered *)
REPEAT
Done := Done OR ( NOT Host_Carrier_Detect );
UNTIL Done OR Async_Receive( Ch ) OR KeyPressed;
(* Process input from keyboard *)
IF KeyPressed THEN
BEGIN
READ( KBD , Ch );
Kbd_Input := TRUE;
IF ( ORD( Ch ) = ESC ) AND KeyPressed THEN
BEGIN
READ( Kbd, Ch );
IF ORD( Ch ) = F1 THEN
Ch := 'G'
ELSE IF ORD( Ch ) = F2 THEN
Ch := 'Q';
END;
END;
IF ( Not DONE ) THEN
(* Echo command *)
Host_Send_String( Ch + CR_LF_Host );
WRITELN;
IF Printer_On THEN
WRITELN( Lst, Ch );
IF Capture_On THEN
WRITELN( Capture_File, Ch );
(* Process command request *)
CASE UpCase( Ch ) OF
'E': Enter_Message;
'R': Read_Messages;
'Q': BEGIN
IF Kbd_Input THEN
BEGIN
Host_Send_String_With_CR('System operator shutting ' +
' down system.');
Host_Send_String_With_CR('Thanks for calling.');
Done := TRUE;
END
ELSE
BEGIN
Host_Send_String_With_CR('Quit and logoff');
Done := TRUE;
END;
END;
'F': Host_Section := 'F';
'G': BEGIN
IF Kbd_Input THEN
BEGIN
Host_Send_String_With_CR(' ... System operator wishes' +
' to chat, please wait ...');
Host_Send_String_With_CR(' ');
Gossip_Mode;
END
ELSE
BEGIN
Page_Sysop( Sysop_Found );
IF Sysop_Found THEN Gossip_Mode;
END;
END;
'C': Enter_Comment;
'P': Scan_Messages( TRUE );
'X': Expert_On := NOT Expert_On;
'S': Scan_Messages( FALSE );
ELSE Host_Send_String( ^G );
END (* CASE *)
END (* Process_Host_Commands *);
(*----------------------------------------------------------------------*)
(* Get_UserInfo --- Read in user name and password *)
(*----------------------------------------------------------------------*)
OVERLAY PROCEDURE Get_UserInfo( VAR Found: BOOLEAN );
(*----------------------------------------------------------------------*)
(* *)
(* Procedure: Get_UserInfo *)
(* *)
(* Purpose: Gets user name and password from remote user. *)
(* *)
(* Calling Sequence: *)
(* *)
(* Get_UserInfo( VAR Found: BOOLEAN ); *)
(* *)
(* Done --- set TRUE if user name found and carrier not *)
(* dropped. *)
(* *)
(*----------------------------------------------------------------------*)
VAR
MyPass: AnyStr;
BEGIN (* Get_UserInfo *)
(* Open log file and record this login *)
ASSIGN( Log_File, 'PIBTERM.LOG' );
(*$I-*)
RESET ( Log_File );
(*$I+*)
IF Int24Result = 0 THEN
BEGIN
CLOSE( Log_File );
APPEND( Log_File );
END
ELSE
REWRITE( Log_File );
(* Prompt for first name *)
Host_Send_String_With_CR(' ');
Host_Prompt_And_Read_String('Enter first name: ', Fname, TRUE );
Fname := TRIM( UpperCase( Fname ) );
(* Prompt for second name *)
Host_Send_String_With_CR(' ');
Host_Prompt_And_Read_String('Enter last name: ', Lname, TRUE );
Lname := TRIM( UpperCase( Lname ) );
(* See if valid user name *)
Cur_User := 0;
Found := FALSE;
REPEAT
Cur_User := Cur_User + 1;
WITH User_List[Cur_User] DO
Found := ( Fname = First_Name ) AND ( Lname = Last_Name );
UNTIL ( Found OR ( Cur_User >= MaxUsers ) );
(* Remember name for message scans *)
Cur_User_Name := Fname + ' ' + Lname;
(* Error if name not in user file *)
IF ( NOT Found ) THEN
BEGIN
Host_Send_String_With_CR(' ');
Host_Send_String_With_CR('Not a valid user name.');
END;
(* Prompt for password *)
IF ( Found AND Async_Carrier_Detect ) THEN
BEGIN
Host_Send_String_With_CR(' ');
Host_Prompt_And_Read_String('Enter Password: ', MyPass, FALSE );
Host_Send_String_With_CR(' ');
(* Check if password valid *)
IF MyPass = User_List[Cur_User].PassWord THEN
BEGIN
Host_Send_String_With_CR('Password OK');
Found := TRUE;
WRITELN( Log_File,Fname,' ',Lname,' logged on at ',
TimeString( TimeOfDay ), ' on ',DateString );
IF Printer_On THEN
WRITELN( Lst , Fname,' ',Lname,' logged on at ',
TimeString( TimeOfDay ), ' on ',DateString );
IF Capture_On THEN
WRITELN( Capture_File , Fname,' ',Lname,' logged on at ',
TimeString( TimeOfDay ), ' on ',DateString );
END
ELSE
BEGIN
Host_Send_String_With_CR('Password wrong');
Found := FALSE;
WRITELN( Log_File,Fname,' ',Lname,' logon try at ',
TimeString( TimeOfDay ), ' on ',DateString,
' password entered = ', MyPass );
IF Printer_On THEN
WRITELN( Lst , Fname,' ',Lname,' logon try at ',
TimeString( TimeOfDay ), ' on ',DateString,
' password entered = ', MyPass );
IF Capture_On THEN
WRITELN( Capture_File , Fname,' ',Lname,' logon try at ',
TimeString( TimeOfDay ), ' on ',DateString,
' password entered = ', MyPass );
END;
END;
(*$I-*)
CLOSE( Log_File );
(*$I+*)
END (* Get_UserInfo *);